home *** CD-ROM | disk | FTP | other *** search
/ Computer Select (Limited Edition) / Computer Select.iso / dobbs / v17n05 / wincom.asc < prev    next >
Encoding:
Text File  |  1992-03-30  |  4.9 KB  |  159 lines

  1. _THE WINDOWS COMMUNICATIONS API_
  2. by Mike Sax
  3.  
  4. [LISTING ONE]
  5.  
  6. ////////////////////////////////////////////////////////////////////////////
  7. //  COMM.C  - by Mike Sax for Dr. Dobb's Journal
  8. //  This file implements a few higher-level communicatons functions under
  9. //  Microsoft Windows. This file contains eight public functions:
  10. //  int OpenComPort(int nPort);
  11. //  BOOL CloseComPort(int nPortID);
  12. //  BOOL SetComPortParameters(int nPortID, int nSpeed, char chParity,
  13. //      int nDataBits, int nStopBits, BOOL bXOnXOff, BOOL bHardware);
  14. //  int CharsWaitingToBeRead(int nPortID);
  15. //  int ComReadChar(int nPortID);
  16. //  int ComReadChars(int nPortID, char *pchBuffer, int cbBuffer);
  17. //  BOOL ComWriteChar(int nPortID, int nChar);
  18. ////////////////////////////////////////////////////////////////////////////
  19.  
  20. #define USECOMM 1               // for 3.1 windows.h
  21. #include <windows.h>
  22. #include "comm.h"
  23.  
  24. // Opens comm port (1 = COM1) and returns its ID value.
  25. // If an error occurs, return value is negative
  26. int OpenComPort(int nPort)
  27.     {
  28.     char szPort[10];
  29.  
  30.     wsprintf(szPort, "COM%d", nPort);
  31.     // Open the port with a 4K input queue and a 2K output queue
  32.     return OpenComm(szPort, 4096, 2048);
  33.     }
  34. // Closes comm port specified by nPortID: returns TRUE if success, 
  35. // FALSE if failure
  36. BOOL CloseComPort(int nPortID)
  37.     {
  38.     if (nPortID < 0)
  39.         return FALSE;
  40.     FlushComm(nPortID,0);       // Flush transmit queue
  41.     FlushComm(nPortID,1);       // Flush receive queue
  42.     return !CloseComm(nPortID);
  43.     }
  44. // Sets communications parameters of port specified by nPortID: 
  45. // returns TRUE if success, FALSE if failure
  46. BOOL SetComPortParameters(int nPortID, int nSpeed, char chParity, 
  47.                   int nDataBits, int nStopBits, BOOL bXOnXOff, BOOL bHardware)
  48.     {
  49.     DCB dcb;
  50.  
  51.     if (nPortID < 0)
  52.         return FALSE;
  53.     dcb.Id = nPortID;
  54.     dcb.BaudRate = nSpeed;
  55.     dcb.ByteSize = (BYTE)nDataBits;
  56.     // Convert chParity to uppercase:
  57.     AnsiUpperBuff(&chParity, 1);
  58.     dcb.Parity =  (chParity == 'N') ? NOPARITY :
  59.                   (chParity == 'O') ? ODDPARITY :
  60.                   (chParity == 'E') ? EVENPARITY :
  61.                   (chParity == 'M') ? MARKPARITY : SPACEPARITY;
  62.     dcb.StopBits = (BYTE)((nStopBits == 1) ? ONESTOPBIT :
  63.                 (nStopBits == 2) ? TWOSTOPBITS : ONE5STOPBITS);
  64.     dcb.RlsTimeout= 0;
  65.     dcb.CtsTimeout = bHardware ? 30 : 0;
  66.     dcb.DsrTimeout = 0;
  67.     dcb.fBinary = TRUE;
  68.     dcb.fRtsDisable = FALSE;
  69.     dcb.fParity = FALSE;
  70.     dcb.fOutxCtsFlow = (BYTE)bHardware;
  71.     dcb.fOutxDsrFlow = FALSE;
  72.     dcb.fDummy = 0;
  73.     dcb.fDtrDisable = FALSE;
  74.     dcb.fOutX = (BYTE)bXOnXOff;
  75.     dcb.fInX = (BYTE)bXOnXOff;
  76.     dcb.fPeChar = FALSE;
  77.     dcb.fNull = FALSE;
  78.     dcb.fChEvt = FALSE;
  79.     dcb.fDtrflow = (BYTE)FALSE;
  80.     dcb.fRtsflow = (BYTE)bHardware;
  81.     dcb.fDummy2 = 0;
  82.     dcb.XonChar = 17;
  83.     dcb.XoffChar = 19;
  84.     dcb.XonLim = 4096 / 4;              // Receive buffer size / 4
  85.     dcb.XoffLim = dcb.XonLim;
  86.     dcb.EofChar = 26;
  87.     dcb.EvtChar = 0;
  88.     dcb.TxDelay = 0;
  89.     return !SetCommState(&dcb);
  90.     }
  91. // Returns the number of characters waiting in the input queue
  92. int CharsWaitingToBeRead(int nPortID)
  93.     {
  94.     COMSTAT ComStat;
  95.  
  96.     if (nPortID < 0)
  97.         return 0;
  98.     GetCommError(nPortID, &ComStat);
  99.     return ComStat.cbInQue;
  100.     }
  101. // Read character from port specified by nPortID: 
  102. // returns -1 if no character available
  103. int ComReadChar(int nPortID)
  104.     {
  105.     int iResult = 0;
  106.  
  107.     if (nPortID < 0)
  108.         return -1;
  109.     if (ReadComm(nPortID, (LPSTR)&iResult, 1) != 1)
  110.         {
  111.         iResult = -1;
  112.         GetCommError(nPortID, NULL);
  113.         }
  114.     return iResult;
  115.     }
  116. // Read character from port specified by nPortID: 
  117. // returns the number of characters read or -1 if an error occurs.
  118. int ComReadChars(int nPortID, char *pchBuffer, int cbBuffer)
  119.     {
  120.     int iResult = 0;
  121.  
  122.     if (nPortID < 0)
  123.         return -1;
  124.     iResult = ReadComm(nPortID, pchBuffer, cbBuffer);
  125.     if (iResult < 0)
  126.         {
  127.         iResult = -1;
  128.         GetCommError(nPortID, NULL);
  129.         }
  130.     return iResult;
  131.     }
  132. // Write a character to the port specified by nPortID
  133. // returns TRUE if success, FALSE if failure
  134. BOOL ComWriteChar(int nPortID, int nChar)
  135.     {
  136.     if (nPortID < 0)
  137.         return FALSE;
  138.     if (1 != WriteComm(nPortID, (LPSTR)&nChar, 1))
  139.         {
  140.         GetCommError(nPortID, NULL);
  141.         return FALSE;
  142.         }
  143.     return TRUE;
  144.     }
  145.  
  146.  
  147.  
  148. [LISTING TWO]
  149.  
  150. BOOL ComWriteChar(int nPortID, int nChar);
  151. int ComReadChar(int nPortID);
  152. int ComReadChars(int nPortID, char *pchBuffer, int cbBuffer);
  153. int CharsWaitingToBeRead(int nPortID);
  154. BOOL SetComPortParameters(int nPortID, int nSpeed, char chParity, 
  155.                  int nDataBits, int nStopBits, BOOL bXOnXOff, BOOL bHardware);
  156. BOOL CloseComPort(int nPortID);
  157. int OpenComPort(int nPort);
  158.  
  159.